之前我們有提過同步傳輸跟非同步傳輸,現在我們要來認識一下,在gRPC中的非同步傳輸要怎麼做,如果不清楚什麼是同步傳輸以及非同步傳輸,可以回頭看看這裡。
StreamObserver是一個監聽的樣板程式,專門用來監聽跟處理stream data的數據接口,在調用函數的時候,首先我們必須要在前段調用另一個非同步的函式newStub()
原本的通道連接函數是這個
IronManServiceGrpc.IronManServiceBlockingStub ironManServiceBlockingStub = IronManServiceGrpc.newBlockingStub(managedChannel);
而非同步傳輸的函式則是這個
IronManServiceGrpc.IronManServiceStub ironManServiceStub = IronManServiceGrpc.newStub(managedChannel);
之後我們在調用service函數的時候才可以使用這個StreamObserver樣板程式來處理我們傳過來的數據,樣板程式如下:
new StreamObserver<XXXProto.XXXResponse>() {
@Override
public void onNext(XXXProto.XXXResponse XXXResponse) {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onCompleted() {
}
}
我們new一個新的 StreamObserver<>,gRPC會自動創建該樣板程式,泛型內會使用response索取回傳的資料格式。
而他的三大區塊,則是有不同的功能:
onNext():當接收到數據後,可以在onNext內操作數據的內容,通常會在這邊做業務邏輯的實作。
onError():當資料傳遞發生錯誤,會在這個地方通知client端,並且可以將錯誤的處理邏輯寫在這邊。
onCompleted():當資料處理完成,server端會回傳一個標記,而這邊會在傳遞結束後執行,等到將資料傳遞結束才執行業務邏輯,可以寫在這裡。
跟之前我們提過的說明responseObserver函數其實是很像的,如果不熟悉或者忘記的話可以再回頭看看,只是這個模板專門用在非同步的傳遞上,因為非同步傳遞並不會等待傳遞完成再繼續執行下面的程式,所以要使用這樣的方式來監聽數據傳遞的結果。
接下來我們就會開始教大家如何使用這個樣板程式來設計非同步傳輸的程式。